在数据挖掘过程中,数据清洗主要根据探索性分析后得到的一些结论入手,然后主要对四类异常数据进行处理;分别是缺失值(missing value),异常值(离群点),去重处理(Duplicate Data)以及噪音数据的处理。
1. 探索性分析
探索性分析部分,对于整个数据来讲是获得对数据一个初步的认识以及对先验知识的一个探索分析过程,在我做相关数据挖掘的过程中,主要是利用python相关的科学计算库进行数据初步的探索,例如数据类型,缺失值,数据集规模,各特征下的数据分布情况等,并利用第三方绘图库进行直观的观察,以获取数据的基本属性与分布情况,另外,通过单变量分析与多变量分析,可以初步探索数据集中各特征之间的关系,以验证在业务分析阶段所提出的假设。
2. 缺失值
数据集中缺失值的获取方法可以直接通过pandas的自带的多种方法获取,在大多数数据集中缺失值都普遍会存在,因此,对于缺失值的处理好坏会直接影响到模型的最终结果。如何处理缺失值,主要依据在缺失值所在属性的重要程度以及缺失值的分布情况。
①.在缺失率少且属性重要程度低的情况下,若属性为数值型数据则根据数据分布情况简单的填充即可,例如:若数据分布均匀,则使用均值对数据进行填充即可;若数据分布倾斜,使用中位数填充即可。若属性为类别属性,则可以用一个全局常量‘Unknow’填充,但是,这样做往往效果很差,因为算法可能会将其识别为一个全新的类别,因此很少使用。
②.当缺失率高(>95%)且属性重要程度低时,直接删除该属性即可。然而在缺失值高且属性程度较高时,直接删除该属性对于算法的结果会造成很不好的影响。
③.缺失值高,属性重要程度高:主要使用的方法有插补法与建模法
(1)插补法主要有随机插补法,多重插补法,热平台插补法,以及拉格朗日插值法与牛顿插值法
1>随机插补法--从总体中随机抽取某几个样本代替缺失样本
2>多重插补法--通过变量之间的关系对缺失数据进行预测,利用蒙特卡洛方法生成多个完整的数据集,在对这些数据集进行分析,最后对分析结果进行汇总处理
3>热平台插补----指在非缺失数据集中找到一个与缺失值所在样本相似的样本(匹配样本),利用其中的观测值对缺失值进行插补。
优点:简单易行,准确率较高
缺点:变量数量较多时,通常很难找到与需要插补样本完全相同的样本。但我们可以按照某些变量将数据分层,在层中对缺失值实用均值插补
4>拉格朗日差值法和牛顿插值法
(2)建模法
可以用回归、贝叶斯、随机森林、决策树等模型对缺失数据进行预测。例如:利用数据集中其他数据的属性,可以构造一棵判定树,来预测缺失值的值。
一般而言,数据缺失值的处理没有统一的流程,必须根据实际数据的分布情况,倾斜程度,缺失值所占比例等来选择方法。在我做数据预处理过程中,除了使用简单的填充法外与删除外,更多情况下采用建模法进行填充,主要在于建模法根据已有的值去预测未知值,准确率较高。但建模法也可能造成属性之间的相关性变大,可能影响最终模型的训练。
3. 异常值(离群点)
判断离群点除了可视化分析外(一般箱线图),还有很多基于统计背景下的方法,且可视化观察不适合用数据量较多的情况。
3.1 简单的统计分析
这一步在EDA中完成,只需要利用pandas的describe方法就可以实现,通过数据集描述性统计,发现是否存在不合理的值,即异常值
3.2 3∂原则--基于正态分布的离群点检测
如果数据服从正态分布,在3∂原则下,异常值为一组测定值中与平均值的偏差超过3倍标准差的值。如果数据服从正态分布,距离平均值3∂之外的值出现的概率为P(|x-u| > 3∂) <= 0.003,属于极个别的小概率事件。如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述。
3.3 基于模型检测
首先建立一个数据模型,异常是那些同模型不能完美拟合的对象;如果模型是簇的集合,则异常是不显著属于任何簇的对象;在使用回归模型时,异常是相对远离预测值的对象
3.4 基于距离
通过在对象之间定义临近性度量,异常对象是那些远离其它对象的对象
优点:简单易操作
缺点:时间复杂度为O(m^2),不适用于大数据集情况,参数选择较为敏感,不能处理具有不同密度区域的数据集,因为它使用全局阈值,不能考虑这种密度的变化
3.5 基于密度
当一个点的局部密度显著低于它的大部分近邻时才将其分类为离群点。适合非均匀分布的数据。
优点:给出了对象是离群点的定量度量,并且即使数据具有不同的区域也能够很好的处理
缺点:时间复杂度O(m^2);参数选择困难,虽然算法通过观察不同的k值,取得最大离群点得分来处理该问题,但是,仍然需要选择这些值的上下界。
3.6 基于聚类
基于聚类的离群点:一个对象是基于聚类的离群点,如果该对象不强属于任何簇。离群点对初始聚类的影响:如果通过聚类检测离群点,则由于离群点影响聚类,存在一个问题:结构是否有效。为了处理该问题,可以使用如下方法:对象聚类,删除离群点,对象再次聚类。
优点:
① 基于线性和接近线性复杂度(k均值)的聚类技术来发现离群点可能是高度有效的 ② 簇的定义通常是离群点的补,因此可能同时发现簇和离群点
缺点:
③ 产生的离群点集和它们的得分可能非常依赖所用的簇的个数和数据中离群点的存在性
④ 聚类算法产生的簇的质量对该算法产生的离群点的质量影响非常大
处理异常点的方法:
1>删除异常值----明显看出是异常且数量较少可以直接删除
2>不处理---如果算法对异常值不敏感则可以不处理,但如果算法对异常值敏感,则最好不要用这种方法,如基于距离计算的一些算法,包括kmeans,knn之类的。
3>平均值替代----损失信息小,简单高效。
4>视为缺失值----可以按照处理缺失值的方法来处理
4. 去重处理
对于重复项的判断,基本思想是“排序与合并”,先将数据集中的记录按一定规则排序,然后通过比较邻近记录是否相似来检测记录是否重复。这里面其实包含了两个操作,一是排序,二是计算相似度。目前在做竞赛过程中主要是用duplicated方法进行判断,然后将重复的样本进行简单的删除处理。
这块目前看到的博客与国外一些比赛的案例基本都采用直接删除进行处理,没有看到过比较有新意的方法。
5. 噪音处理
噪音是被测变量的随机误差或者方差,主要区别于离群点。由公式:观测量(Measurement) = 真实数据(True Data) + 噪声 (Noise)。离群点属于观测量,既有可能是真实数据产生的,也有可能是噪声带来的,但是总的来说是和大部分观测量之间有明显不同的观测值。噪音包括错误值或偏离期望的孤立点值,但也不能说噪声点包含离群点,虽然大部分数据挖掘方法都将离群点视为噪声或异常而丢弃。然而,在一些应用(例如:欺诈检测),会针对离群点做离群点分析或异常挖掘。而且有些点在局部是属于离群点,但从全局看是正常的。
对于噪音的处理主要采用分箱法于回归法进行处理:
(1) 分箱法:
分箱方法通过考察数据的“近邻”来光滑有序数据值。这些有序的值被分布到一些“桶”或箱中。由于分箱方法考察近邻的值,因此它进行局部光滑。
l 用箱均值光滑:箱中每一个值被箱中的平均值替换。
l 用箱中位数平滑:箱中的每一个值被箱中的中位数替换。
l 用箱边界平滑:箱中的最大和最小值同样被视为边界。箱中的每一个值被最近的边界值替换。
一般而言,宽度越大,光滑效果越明显。箱也可以是等宽的,其中每个箱值的区间范围是个常量。分箱也可以作为一种离散化技术使用.
(2) 回归法
可以用一个函数拟合数据来光滑数据。线性回归涉及找出拟合两个属性(或变量)的“最佳”直线,使得一个属性能够预测另一个。多线性回归是线性回归的扩展,它涉及多于两个属性,并且数据拟合到一个多维面。使用回归,找出适合数据的数学方程式,能够帮助消除噪声。